/**
 * ETSDB 基本使用示例
 * 
 * 本示例展示了如何在鸿蒙系统上使用ETSDB数据库进行基本的CRUD操作
 * 
 * @example
 * ```
 * // 在鸿蒙应用中导入并使用
 * import etsdb from '../src/etsdb.js';
 * 
 * // 创建数据库实例
 * const db = etsdb.openDatabase('my-database');
 * 
 * // 定义模型
 * const User = db.model('User', {
 *   name: String,
 *   age: Number,
 *   email: String,
 *   active: Boolean,
 *   createdAt: Date
 * });
 * 
 * // 执行CRUD操作
 * ```
 */

// 导入ETSDB模块
import etsdb from '../src/etsdb.js';

/**
 * 基本使用示例
 */
async function basicUsageExample() {
  try {
    console.log('====== ETSDB 基本使用示例 ======');
    
    // 1. 创建或打开数据库
    console.log('1. 创建或打开数据库');
    const db = etsdb.openDatabase({
      name: 'example-db',
      inMemory: false, // 使用文件存储
      debug: true      // 开启调试日志
    });
    console.log('数据库连接成功');
    
    // 2. 定义数据模型
    console.log('\n2. 定义数据模型');
    
    // 定义用户模型
    const User = db.model('User', {
      name: String,
      age: Number,
      email: String,
      active: Boolean,
      role: String,
      createdAt: Date,
      updatedAt: Date
    });
    
    // 定义文章模型
    const Article = db.model('Article', {
      title: String,
      content: String,
      authorId: String,  // 关联到User的_id
      tags: Array,
      published: Boolean,
      views: Number,
      createdAt: Date
    });
    
    console.log('已定义模型: User, Article');
    
    // 3. 插入文档
    console.log('\n3. 插入文档');
    
    // 开始事务
    await db.beginTransaction();
    
    try {
      // 创建用户
      const user1 = await User.create({
        name: '张三',
        age: 30,
        email: 'zhangsan@example.com',
        active: true,
        role: 'admin',
        createdAt: new Date(),
        updatedAt: new Date()
      });
      
      const user2 = await User.create({
        name: '李四',
        age: 25,
        email: 'lisi@example.com',
        active: true,
        role: 'user',
        createdAt: new Date(),
        updatedAt: new Date()
      });
      
      console.log(`已创建用户: ${user1.name}, ${user2.name}`);
      
      // 创建文章
      await Article.create({
        title: '鸿蒙系统入门教程',
        content: '这是一篇关于鸿蒙系统开发的入门教程...',
        authorId: user1._id,
        tags: ['鸿蒙', '教程', '入门'],
        published: true,
        views: 100,
        createdAt: new Date()
      });
      
      await Article.create({
        title: 'ETSDB数据库使用指南',
        content: '本文介绍如何在鸿蒙应用中使用ETSDB数据库...',
        authorId: user1._id,
        tags: ['ETSDB', '数据库', '指南'],
        published: true,
        views: 50,
        createdAt: new Date()
      });
      
      await Article.create({
        title: '待发布文章',
        content: '这是一篇尚未发布的文章...',
        authorId: user2._id,
        tags: ['草稿'],
        published: false,
        views: 0,
        createdAt: new Date()
      });
      
      console.log('已创建3篇文章');
      
      // 提交事务
      await db.commitTransaction();
      console.log('事务提交成功');
    } catch (error) {
      // 出错时回滚事务
      await db.rollbackTransaction();
      console.error('事务回滚:', error);
      throw error;
    }
    
    // 4. 查询文档
    console.log('\n4. 查询文档');
    
    // 查询所有用户
    const allUsers = await User.find();
    console.log(`所有用户 (${allUsers.length}):`, allUsers);
    
    // 条件查询 - 查找年龄大于28的用户
    const olderUsers = await User.find({ age: { $gt: 28 } });
    console.log(`年龄大于28的用户 (${olderUsers.length}):`, olderUsers);
    
    // 条件查询 - 查找已发布的文章
    const publishedArticles = await Article.find({ published: true });
    console.log(`已发布的文章 (${publishedArticles.length}):`, publishedArticles);
    
    // 根据ID查询
    if (allUsers.length > 0) {
      const userById = await User.findById(allUsers[0]._id);
      console.log('根据ID查询用户:', userById);
    }
    
    // 5. 更新文档
    console.log('\n5. 更新文档');
    
    // 更新单条文档
    if (allUsers.length > 0) {
      const updatedUser = await User.updateById(allUsers[0]._id, {
        $set: {
          age: 31,
          updatedAt: new Date()
        },
        $inc: {
          // 年龄也可以通过$inc增加
          // age: 1
        }
      });
      console.log('更新后的用户:', updatedUser);
    }
    
    // 更新多条文档 - 增加所有已发布文章的浏览量
    const updatedCount = await Article.update(
      { published: true },
      { $inc: { views: 10 } }
    );
    console.log(`已更新 ${updatedCount} 篇文章的浏览量`);
    
    // 6. 删除文档
    console.log('\n6. 删除文档');
    
    // 删除单条文档
    const articles = await Article.find({ published: false });
    if (articles.length > 0) {
      const deleted = await Article.deleteById(articles[0]._id);
      console.log('已删除草稿文章:', deleted);
    }
    
    // 7. 集合监听
    console.log('\n7. 集合监听');
    
    // 监听User集合的变化
    const userListener = (change) => {
      console.log('User集合发生变化:', change);
    };
    
    db.watch('User', userListener);
    console.log('已开始监听User集合');
    
    // 创建一个新用户以触发监听
    await User.create({
      name: '王五',
      age: 28,
      email: 'wangwu@example.com',
      active: true,
      role: 'user',
      createdAt: new Date(),
      updatedAt: new Date()
    });
    
    // 取消监听
    setTimeout(() => {
      db.unwatch('User', userListener);
      console.log('已取消监听User集合');
    }, 1000);
    
    // 8. 数据库统计
    console.log('\n8. 数据库统计');
    const stats = await db.getStats();
    console.log('数据库统计信息:', stats);
    
    // 9. 关闭数据库
    console.log('\n9. 关闭数据库');
    await db.close();
    console.log('数据库已关闭');
    
    console.log('\n====== ETSDB 基本使用示例结束 ======');
  } catch (error) {
    console.error('示例执行出错:', error);
  }
}

/**
 * 关系查询示例
 */
async function relationExample() {
  try {
    console.log('\n\n====== ETSDB 关系查询示例 ======');
    
    const db = etsdb.openDatabase('example-db');
    const User = db.model('User');
    const Article = db.model('Article');
    
    // 查询用户及其所有文章
    const usersWithArticles = [];
    const users = await User.find();
    
    for (const user of users) {
      const articles = await Article.find({ authorId: user._id });
      usersWithArticles.push({
        ...user,
        articles
      });
    }
    
    console.log('用户及其文章:', usersWithArticles);
    
    console.log('\n====== ETSDB 关系查询示例结束 ======');
  } catch (error) {
    console.error('关系查询示例出错:', error);
  }
}

/**
 * 运行所有示例
 */
async function runExamples() {
  await basicUsageExample();
  await relationExample();
}

// 运行示例
runExamples();